# class 类名:	属性	...	方法	...


# 上面 Cat 类中定义的属性和方法都是公开的，除此之外我们还可以定义私有属性和方法，
# 声明方式为：在属性名或方法名前加两条下划线。
# 需要强调一点是：外部不能访问私有属性和调用私有方法，自然 Cat.__cid 是会报错的。
class Dog:
    # 公有属性

    color = 'green'
    name = '佩奇'
    age = 14
    # 私有属性
    __id = 1

    # 构造方法/构造器/构造函数
    def __init__(self):
        self.color = 'red'
        self.name = '小花'
        self.age = 30

    def __init__(self):
        pass

    # 构造方法 __init__() 会在类实例化时自动调用。无论构造方法还是其他方法都需要将 self 作为第一个参数，它代表类的实例。
    # 类创建好后，我们可以直接通过类名访问属性，格式为：类名.属性名，比如我们访问 Cat 类的 color 属性，如下所示：

    # 公有方法狗叫方法
    def call(self):
        # self表示当前对象
        # 在内部私有属性和方法是可以被访问和调用的。
        self.__kindhome()
        print(self.name + str(self.__id) + ",别叫了")

    def eat(self):
        # 字符串与数字不能做连接
        print(self.name + self.color + "吃骨头")

    def __kindhome(self):
        print("狗看家")


print("*" * 30 + "以下类外")
# print(1 + "a" + "b")
# 类创建好后，我们可以直接通过类名访问属性，格式为：类名.属性名，
# 比如我们访问 Cat 类的 color 属性，如下所示：
print(Dog.color + Dog.name)

# 2.2 对象
# 创建对象也称类的实例化，比如我们通过 Cat 类创建对象，如下所示：
# 创建对象c = Cat('Tom')
d = Dog()
# 对象名.属性名获取值
print(d.age)
# 对象.方法名
d.call()
# 类外不能调用私有方法
# d.kindhome()
# Dog.call() call()方法必须改为静态方法
# AttributeError
# print(d.id)
